package cn.lycode.common.utils;

import cn.dev33.satoken.secure.SaSecureUtil;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.StpUtil;
import cn.lycode.common.constant.Constants;
import cn.lycode.common.core.domain.model.user.LoginUserInfo;
import cn.lycode.common.exception.ServiceException;

import java.util.HashMap;
import java.util.Map;

/**
 * 密码加密
 *
 * @author ican
 **/
public class SecurityUtils {
    private static Map<Long, String> usernameMap = new HashMap<>(32);

    /**
     * 校验密码
     *
     * @param input  用户输入密码
     * @param userPassword 数据库存储密码
     * @return 是否正确
     */
    public static boolean checkPassword(String input, String userPassword) {
        String encryptedPassword = sha256Encrypt(input);
        return StringUtils.equals(encryptedPassword, userPassword);
    }

    /**
     * sha256加密
     *
     * @param password 密码
     * @return 加密后的密码
     */
    public static String sha256Encrypt(String password) {
        return SaSecureUtil.sha256(password);
    }


    /**
     * 是否为超级管理员
     * @param userId 用户ID
     * @return 结果
     */
    public static boolean isSuperAdmin(Long userId) {
        return Constants.SUPER_ADMIN_ID.equals(userId);
    }

    public static boolean isSuperAdminRole(Long roleId) {
        return Constants.SUPER_ADMIN_ROLE_ID.equals(roleId);
    }

    public static Long getLoginUserId() {
        return StpUtil.getLoginIdAsLong();
    }

    public static LoginUserInfo getLoginUserInfo(){
        SaSession tokenSession = StpUtil.getTokenSession();
        return  (LoginUserInfo)tokenSession.get(Constants.LOGIN_USER_INFO);
    }

    public static String getLoginUsername(){
        try {
            LoginUserInfo loginUser = getLoginUserInfo();
            return loginUser.getBaseUserInfo().getUsername();
        } catch (Exception e) {

            throw new ServiceException("获取登录用户异常");
        }
    }

    public static void clearLoginUserSession(){
        // 注意执行顺序，最后再执行logout
        StpUtil.getTokenSession().logout(); // 清除缓存session
        StpUtil.logout();   // 退出登录

    }

    /**
     * 检查是否有权限
     * @param perm 检查权限
     * @return 是否有权限
     */
    public static boolean hasPermission(String perm) {
        return StpUtil.hasPermission(perm);
    }

    /**
     * 校验是否具备权限， 不具备抛出NotPermissionException 异常
     * @param perm 检查权限
     */
    public static void checkPermission(String perm) {
        StpUtil.checkPermission(perm);
    }
}